Given an integer array arr
and a target value target
, return the integer value
such that when we change all the integers larger than value
in the given array to be equal to value
, the sum of the array gets as close as possible (in absolute difference) to target
.
In case of a tie, return the minimum such integer.
Notice that the answer is not neccesarilly a number from arr
.
Input: arr = [4,9,3], target = 10 Output: 3 Explanation: When using 3 arr converts to [3, 3, 3] which sums 9 and that's the optimal answer.
Input: arr = [2,3,5], target = 10 Output: 5
Input: arr = [60864,25176,27249,21296,20204], target = 56803 Output: 11361
1 <= arr.length <= 104
1 <= arr[i], target <= 105
implSolution{pubfnfind_best_value(arr:Vec<i32>,target:i32) -> i32{letmut arr = arr;letmut prefix_sum = 0;letmut diff = target;letmut value = 0; arr.push(0); arr.sort_unstable();for i in1..arr.len(){letmut l = arr[i - 1];letmut r = arr[i];while l <= r {let m = (l + r) / 2;let sum = prefix_sum + m *(arr.len() - i)asi32;if sum == target {return m;}elseif sum < target { l = m + 1;}else{ r = m - 1;}}letmut rdiff = (prefix_sum + r *(arr.len() - i)asi32 - target).abs();letmut ldiff = (prefix_sum + l *(arr.len() - i)asi32 - target).abs();if r >= arr[i - 1] && rdiff < diff { diff = rdiff; value = r;}if l <= arr[i] && ldiff < diff { diff = ldiff; value = l;} prefix_sum += arr[i];} value }}